{
 "cells": [
  {
   "cell_type": "code",
   "id": "2d980dfd-813f-426d-91c3-1e71cf39aa29",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:52:54.924753Z",
     "start_time": "2025-08-25T01:52:51.039334Z"
    }
   },
   "source": [
    "import gym\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from scipy.special import softmax\n",
    "import numpy as np\n",
    "import os\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from tqdm import tqdm\n",
    "\n",
    "import draw\n",
    "import utils"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.\n",
      "Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.\n",
      "See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e1c97c1-600f-450f-91d8-a01e2d2bb775",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-09T07:41:43.243939Z",
     "start_time": "2025-05-09T07:41:43.240935Z"
    }
   },
   "outputs": [],
   "source": [
    "# !pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gym==0.25.2\n",
    "# !pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame==2.5.2\n",
    "# !pip install  moviepy"
   ]
  },
  {
   "cell_type": "code",
   "id": "e098e422-6333-47de-ac33-f4c2dbee52c3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:53:13.622079Z",
     "start_time": "2025-08-25T01:53:13.616349Z"
    }
   },
   "source": [
    "from base64 import b64encode  # 导入base64编码函数，用于视频编码\n",
    "from IPython.display import display, HTML  # 导入display和HTML函数，用于在Jupyter中显示内容\n",
    "# from moviepy.editor import ImageSequenceClip  # 导入ImageSequenceClip（已注释），用于创建视频剪辑\n",
    "\n",
    "# 录制CartPole环境的视频\n",
    "def record_video(agent, env_name='CartPole-v0', video_dir='video'):  # 定义录制视频的函数，参数为智能体、环境名称和视频保存目录\n",
    "    env = gym.make(env_name)  # 创建指定名称的gym环境\n",
    "    env = gym.wrappers.RecordVideo(env, video_dir, episode_trigger=lambda x: True)  # 使用RecordVideo包装器记录每个回合的视频\n",
    "    state = env.reset()  # 重置环境并获取初始状态\n",
    "    done = False  # 初始化终止标志为False\n",
    "    cnt = 0  # 初始化步数计数器\n",
    "    while not done:  # 当回合未结束时循环\n",
    "        action = agent.take_action(state)  # 智能体根据当前状态选择动作\n",
    "        state, _, done, _ = env.step(action)  # 执行动作，获取新状态和是否终止的信息\n",
    "        cnt = cnt+1  # 步数加1\n",
    "    print(cnt)  # 打印总步数\n",
    "    env.close()  # 关闭环境\n",
    "\n",
    "def display_video(file_path):  # 定义显示视频的函数，参数为视频文件路径\n",
    "    video = open(file_path, \"rb\").read()  # 以二进制模式读取视频文件\n",
    "    encoded_video = b64encode(video).decode(\"ascii\")  # 将视频内容编码为base64字符串\n",
    "    display(HTML(data=f\"\"\"  # 使用HTML显示视频\n",
    "        <video width=\"640\" height=\"480\" controls>  <!-- 创建视频元素，设置宽高和控制栏 -->\n",
    "            <source src=\"data:video/mp4;base64,{encoded_video}\" type=\"video/mp4\" />  <!-- 设置视频源为base64编码的数据 -->\n",
    "        </video>\n",
    "    \"\"\"))"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "id": "c9fa4566-a8de-4dbc-bb30-189c31a128d0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:53:17.473089Z",
     "start_time": "2025-08-25T01:53:17.462730Z"
    }
   },
   "source": [
    "class PolicyNet(torch.nn.Module):\n",
    "    \"\"\"\n",
    "    输入状态，输出是策略值，action_dim是2\n",
    "    \"\"\"\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim):\n",
    "        super(PolicyNet, self).__init__()\n",
    "        self.fc1 = torch.nn.Linear(state_dim, 128)\n",
    "        self.fc2 = torch.nn.Linear(128, action_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = F.relu(self.fc1(x))\n",
    "        return F.softmax(self.fc2(x), dim=-1)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "id": "ffbbd90e-b0b2-47ba-a9e3-a0e3fdaa1118",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:53:19.471060Z",
     "start_time": "2025-08-25T01:53:19.462021Z"
    }
   },
   "source": [
    "class REINFORCE:\n",
    "    def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma, device = torch.device(\"cpu\")):\n",
    "        self.action_dim = action_dim  # 动作空间维度\n",
    "        self.state_dim =state_dim  # 状态空间维度\n",
    "        self.policy_net = PolicyNet(state_dim, hidden_dim, action_dim).to(device)  # 创建策略网络并移至指定设备\n",
    "        self.device = device  # 计算设备（CPU或GPU）\n",
    "        \n",
    "        self.optimizer = torch.optim.Adam(self.policy_net.parameters(), lr=learning_rate)  # 使用Adam优化器\n",
    "        self.gamma = gamma  # 折扣因子\n",
    "        self.epsilon = 1  # 探索率，初始值为1\n",
    "\n",
    "    def save_model(self, path):\n",
    "        torch.save(self.policy_net.state_dict(), path)  # 保存模型参数\n",
    "\n",
    "    def load_model(self, path):\n",
    "        self.policy_net.load_state_dict(torch.load(path, map_location=self.device))  # 加载模型参数\n",
    "        \n",
    "    def save_model(self, path):\n",
    "        torch.save(self.policy_net, path)  # 保存整个模型\n",
    "    def load_model(self, path):\n",
    "        self.policy_net = torch.load(path)  # 加载整个模型\n",
    "        \n",
    "    def take_action(self, state): \n",
    "        if np.random.rand() < self.epsilon:  # 以epsilon的概率随机选择动作（探索）\n",
    "            return np.random.choice(self.action_dim)  # 随机选择一个动作\n",
    "        else:\n",
    "            input = torch.tensor(state, dtype=torch.float).to(self.device)  # 将状态转换为张量并移至设备\n",
    "            output = self.policy_net(input)  # 通过策略网络获取动作概率分布\n",
    "            now_frame_probabilities  = output.detach().cpu().numpy()  # 将概率分布转换为numpy数组\n",
    "            action = np.random.choice(self.action_dim, p=now_frame_probabilities)  # 根据概率分布采样动作\n",
    "            return action  # 返回选择的动作\n",
    "    \n",
    "    def update(self, transition_dict):\n",
    "        reward_list = transition_dict['rewards']  # 获取奖励列表\n",
    "        state_list = transition_dict['states']  # 获取状态列表\n",
    "        action_list = transition_dict['actions']  # 获取动作列表\n",
    "        G = 0  # 初始化累积奖励为0\n",
    "        self.optimizer.zero_grad()  # 清空梯度\n",
    "        for i in reversed(range(len(reward_list))):  # 从最后一步算起\n",
    "            reward = reward_list[i]  # 获取当前步骤的奖励\n",
    "            state = state_list[i]  # 获取当前步骤的状态\n",
    "            action = action_list[i]  # 获取当前步骤的动作\n",
    "            G = self.gamma * G + reward  # 计算折扣累积奖励\n",
    "            input = torch.tensor(state, dtype=torch.float).to(self.device)  # 将状态转换为张量并移至设备\n",
    "            log_prob = torch.log(self.policy_net(input)[action])  # 对所选动作的概率求对数，用于计算梯度\n",
    "            loss = log_prob * G  # 计算损失函数，G为正时鼓励该动作，G为负时惩罚该动作\n",
    "            loss = -loss  # 梯度上升（最大化期望回报），需要将损失取负\n",
    "            loss.backward()  # 反向传播计算梯度\n",
    "        self.optimizer.step()  # 更新网络参数"
   ],
   "outputs": [],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "id": "034cd99f-d895-4914-9b50-88487b91231a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:53:24.877507Z",
     "start_time": "2025-08-25T01:53:24.872079Z"
    }
   },
   "source": [
    "def train():\n",
    "    env = gym.make('CartPole-v0')  # 创建CartPole-v0环境\n",
    "    agent = REINFORCE(state_dim = 4,  # 创建REINFORCE智能体，状态维度为4\n",
    "              hidden_dim= 128,  # 隐藏层维度为128\n",
    "              action_dim = 2,  # 动作维度为2\n",
    "              learning_rate = 0.001,  # 学习率设为0.001\n",
    "              gamma = 0.98)  # 折扣因子设为0.98\n",
    "\n",
    "    print(agent.policy_net)  # 打印策略网络结构\n",
    "    return_list = []  # 初始化回报列表，用于记录每个回合的累积奖励\n",
    "    agent.epsilon = 0  # 将探索率设为0，即完全依赖策略网络选择动作\n",
    "    num_episodes = 3000  # 设置训练回合数为300\n",
    "    pbar = tqdm(range(num_episodes))  # 创建进度条\n",
    "    for i in pbar:# 10000  # 循环训练指定回合数\n",
    "        episode_return = 0  # 初始化当前回合的累积奖励为0\n",
    "        transition_dict = {  # 初始化转移字典，用于存储轨迹数据\n",
    "            'states': [],  # 状态列表\n",
    "            'actions': [],  # 动作列表\n",
    "            'next_states': [],  # 下一状态列表\n",
    "            'rewards': [],  # 奖励列表\n",
    "            'dones': []  # 终止标志列表\n",
    "        }\n",
    "        state = env.reset()  # 重置环境，获取初始状态\n",
    "        done = False  # 初始化终止标志为False\n",
    "        cnt = 0  # 初始化步数计数器为0\n",
    "        while not done:  # 当回合未结束时循环\n",
    "            cnt = cnt + 1  # 步数计数器加1\n",
    "            # print(state)  # (注释掉的代码)打印当前状态\n",
    "            action = agent.take_action(state) ########  # 智能体根据当前状态选择动作\n",
    "            # print(action)  # (注释掉的代码)打印选择的动作\n",
    "            next_state, reward, done, _ = env.step(action)  # 执行动作，获取下一状态、奖励、终止标志和其他信息\n",
    "            transition_dict['states'].append(state)  # 将当前状态添加到状态列表\n",
    "            transition_dict['actions'].append(action)  # 将当前动作添加到动作列表\n",
    "            transition_dict['next_states'].append(next_state)  # 将下一状态添加到下一状态列表\n",
    "            transition_dict['rewards'].append(reward)  # 将奖励添加到奖励列表\n",
    "            transition_dict['dones'].append(done)  # 将终止标志添加到终止标志列表\n",
    "            state = next_state  # 更新当前状态为下一状态\n",
    "            episode_return += reward  # 累加奖励\n",
    "        return_list.append(episode_return)  # 将当前回合的累积奖励添加到回报列表\n",
    "        agent.update(transition_dict)  # 使用收集的轨迹数据更新智能体的策略网络\n",
    "        if (i + 1) % 10 == 0:  # 每10个回合\n",
    "            pbar.set_postfix({  # 更新进度条显示的信息\n",
    "                'episode':\n",
    "                '%d' % i,  # 显示当前回合数\n",
    "                'return':\n",
    "                '%.3f' % np.mean(return_list[-10:]),  # 显示最近10个回合的平均回报\n",
    "                'cnt': cnt  # 显示最后一个回合的步数\n",
    "            })\n",
    "        pbar.update(1)  # 更新进度条\n",
    "\n",
    "        if(i % 100==0):  # 每100个回合\n",
    "            agent.save_model('./models/'+f\"{i}.pth\")  # 保存模型到指定路径\n",
    "\n",
    "    print(sum(return_list)/len(return_list))  # 打印所有回合的平均回报\n",
    "    agent.save_model('./models/'+f\"{num_episodes}.pth\")  # 保存最终模型\n",
    "    return agent  # 返回训练好的智能体"
   ],
   "outputs": [],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "id": "f80548e1-b51d-487a-aac7-efee3a7ffc68",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T01:55:35.829466Z",
     "start_time": "2025-08-25T01:53:29.107021Z"
    }
   },
   "source": [
    "training_agent = train()"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\YuBin\\AppData\\Roaming\\Python\\Python312\\site-packages\\gym\\envs\\registration.py:593: UserWarning: \u001B[33mWARN: The environment CartPole-v0 is out of date. You should consider upgrading to version `v1`.\u001B[0m\n",
      "  logger.warn(\n",
      "C:\\Users\\YuBin\\AppData\\Roaming\\Python\\Python312\\site-packages\\gym\\core.py:317: DeprecationWarning: \u001B[33mWARN: Initializing wrapper in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001B[0m\n",
      "  deprecation(\n",
      "C:\\Users\\YuBin\\AppData\\Roaming\\Python\\Python312\\site-packages\\gym\\wrappers\\step_api_compatibility.py:39: DeprecationWarning: \u001B[33mWARN: Initializing environment in old step API which returns one bool instead of two. It is recommended to set `new_step_api=True` to use new step API. This will be the default behaviour in future.\u001B[0m\n",
      "  deprecation(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "PolicyNet(\n",
      "  (fc1): Linear(in_features=4, out_features=128, bias=True)\n",
      "  (fc2): Linear(in_features=128, out_features=2, bias=True)\n",
      ")\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 3000/3000 [02:05<00:00, 23.95it/s, episode=2999, return=200.000, cnt=200]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "177.23066666666668\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "id": "e0618e01-0939-4ce0-becc-7646658751e5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-25T02:08:18.875230Z",
     "start_time": "2025-08-25T02:08:16.959867Z"
    }
   },
   "source": [
    "record_video(training_agent)\n",
    "display_video('./video/rl-video-episode-0.mp4')"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ],
      "text/html": [
       "  # 使用HTML显示视频\n",
       "        <video width=\"640\" height=\"480\" controls>  <!-- 创建视频元素，设置宽高和控制栏 -->\n",
       "            <source src=\"data:video/mp4;base64,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AAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAADJAAAAAQAAAzhzdHN6AAAAAAAAAAAAAADJAAAEhwAAAFMAAAAlAAAAFAAAADAAAABYAAAAKAAAAD4AAAAWAAAAcgAAADwAAAAjAAAAIwAAAB8AAAAtAAAAHwAAAB8AAABjAAAAJAAAABIAAAAtAAAAqwAAAEwAAAA8AAAAHwAAAFkAAAArAAAAGwAAACwAAABCAAAAJQAAABIAAAAwAAAAcQAAADIAAAAeAAAAHgAAAFEAAABBAAAAJwAAADAAAABtAAAANgAAACcAAAAnAAAAeQAAADYAAAArAAAAJwAAAGwAAAA/AAAAJwAAADgAAAA+AAAAMwAAACsAAAA7AAAAQwAAACgAAAAlAAAAKAAAAEYAAABCAAAAIgAAACcAAABfAAAAQgAAACMAAAArAAAARAAAACgAAAAqAAAAJgAAAHUAAAA+AAAAHgAAAC8AAABjAAAAJgAAACQAAAAnAAAANAAAACUAAAAxAAAAIwAAAF0AAAA8AAAATgAAAC8AAABIAAAAKwAAACcAAAAkAAAAVwAAAD8AAAAnAAAAKgAAAEUAAAArAAAALQAAACUAAABIAAAANQAAACcAAAAoAAAAUAAAAFQAAAAoAAAALAAAAE4AAAApAAAAJQAAACsAAABVAAAAMwAAACQAAAAtAAAANgAAAC0AAAArAAAAJwAAAFwAAAAwAAAALQAAACkAAAByAAAANAAAADgAAAAmAAAAbAAAADMAAAApAAAAPwAAAEQAAAAqAAAAKgAAACkAAABIAAAAKgAAACgAAAAoAAAASAAAAEQAAAAjAAAAJwAAAE4AAAA5AAAAHQAAACkAAABXAAAAMgAAACwAAAAoAAAAMAAAACcAAAAkAAAAOAAAAHsAAAAyAAAAPgAAACcAAABKAAAAMwAAAC8AAAAlAAAAXAAAADEAAAA0AAAAJAAAAGcAAAAqAAAANAAAADUAAACEAAAASQAAAC0AAAAqAAAAawAAADwAAAAoAAAALwAAAGMAAAAzAAAAKwAAACcAAACZAAAANAAAACgAAAA2AAAAQQAAAEAAAAAoAAAAKQAAAFYAAAAuAAAAKgAAACgAAABCAAAALgAAABwAAAArAAAAFHN0Y28AAAAAAAAAAQAAADAAAABhdWR0YQAAAFltZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAACxpbHN0AAAAJKl0b28AAAAcZGF0YQAAAAEAAAAATGF2ZjYxLjcuMTAw\" type=\"video/mp4\" />  <!-- 设置视频源为base64编码的数据 -->\n",
       "        </video>\n",
       "    "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 8
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "97dd53a0-155c-4c65-a695-a36bc718a15b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-09T07:48:23.013430Z",
     "start_time": "2025-05-09T07:48:22.628554Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\41507\\AppData\\Local\\Temp\\ipykernel_23132\\609776650.py:21: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.\n",
      "  self.policy_net = torch.load(path)  # 加载整个模型\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "  # 使用HTML显示视频\n",
       "        <video width=\"640\" height=\"480\" controls>  <!-- 创建视频元素，设置宽高和控制栏 -->\n",
       "            <source src=\"data:video/mp4;base64,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AAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAQAAAAAAgAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAACAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAAAwAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAEAAAAAAIAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAEAAAAAAIAAAEAAAAAAgAAAgAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAAQAABQAAAAABAAACAAAAAAEAAAAAAAAAAQAAAQAAAAABAAAFAAAAAAEAAAIAAAAAAQAAAAAAAAABAAABAAAAAAEAAAUAAAAAAQAAAgAAAAABAAAAAAAAAAEAAAEAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAADJAAAAAQAAAzhzdHN6AAAAAAAAAAAAAADJAAAEoQAAADoAAABWAAAAIgAAACQAAABTAAAAIgAAADIAAAAdAAAAIgAAACcAAAAeAAAAHgAAABoAAAAUAAAAEgAAABIAAAAcAAAANAAAAEcAAAAhAAAAFAAAAFIAAAA9AAAAHwAAACUAAABWAAAARQAAACQAAAAoAAAAdgAAACMAAAAkAAAAEgAAAIgAAAAiAAAAMwAAABIAAAC8AAAAPgAAACEAAAAkAAAAZQAAADYAAAAcAAAAIQAAAHgAAAA9AAAAIQAAAB4AAAA+AAAATQAAACsAAAAtAAAAegAAACwAAAA0AAAALwAAAIQAAAB+AAAANwAAACMAAAApAAAATQAAAE8AAAAgAAAALwAAAEMAAAAyAAAAJgAAACMAAAC6AAAAQgAAACsAAAAvAAAAzQAAAD4AAACpAAAANQAAADsAAAAoAAAAjwAAAEUAAAAsAAAAOQAAAKUAAAA/AAAALwAAACcAAABJAAAAMwAAACUAAAAgAAAANwAAAB8AAAAkAAAAHAAAALYAAABQAAAAOAAAADkAAACMAAAAPwAAADYAAAA3AAAANwAAACgAAAAuAAAALQAAAGwAAAArAAAAKwAAAHMAAAA6AAAAKgAAACUAAACFAAAAPQAAAC0AAAAtAAAAXQAAAC0AAABEAAAAMQAAAGcAAABBAAAAKAAAAC8AAABtAAAANAAAADkAAABDAAAAQQAAAFEAAAAnAAAAMwAAACYAAAA5AAAAJgAAACoAAAAjAAAAkgAAADIAAAArAAAAJQAAAL0AAAAuAAAAKQAAADMAAACfAAAAQwAAADQAAAAnAAAAbQAAADoAAAAoAAAALQAAAHYAAAAuAAAAKQAAACQAAABjAAAAVgAAADUAAAA3AAAApgAAADkAAAA0AAAAMQAAAHYAAAAkAAAAJwAAACEAAABMAAAAOAAAACcAAAAgAAAAWQAAADkAAAApAAAAIwAAAHQAAABAAAAAMAAAADQAAABiAAAAPQAAAB4AAAAtAAAAagAAAEwAAAAmAAAAKwAAADUAAAA7AAAAOwAAACsAAABMAAAASwAAADIAAABOAAAAFHN0Y28AAAAAAAAAAQAAADAAAABhdWR0YQAAAFltZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAACxpbHN0AAAAJKl0b28AAAAcZGF0YQAAAAEAAAAATGF2ZjYxLjcuMTAw\" type=\"video/mp4\" />  <!-- 设置视频源为base64编码的数据 -->\n",
       "        </video>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "agent123 = REINFORCE(state_dim = 4, \n",
    "          hidden_dim= 128, \n",
    "          action_dim = 2, \n",
    "          learning_rate = 0.001, \n",
    "          gamma = 0.98)\n",
    "agent123.epsilon = 0\n",
    "agent123.load_model('./models/3000.pth')\n",
    "record_video(agent123)\n",
    "display_video('./video/rl-video-episode-0.mp4')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4bc8c022-2bba-412b-87fa-7531a0bea014",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-05-09T07:43:46.375844Z",
     "start_time": "2025-05-09T07:43:46.373841Z"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
